package com.itcam.maker.meta;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;

/**
 * @author : Cammy.Wu
 * Description : 
 */

/**
 * 元数据类，用于存储项目的元数据信息
 */
@NoArgsConstructor
@Data
public class Meta {

    /**
     * 项目名称
     */
    private String name;

    /**
     * 项目描述
     */
    private String description;

    /**
     * 项目的基础包名
     */
    private String basePackage;

    /**
     * 项目版本号
     */
    private String version;

    /**
     * 项目作者
     */
    private String author;

    /**
     * 项目创建时间
     */
    private String createTime;

    /**
     * 文件配置信息
     */
    private FileConfig fileConfig;

    /**
     * 模型配置信息
     */
    private ModelConfig modelConfig;

    /**
     * 文件配置类，用于存储文件相关的配置信息
     */
    @NoArgsConstructor
    @Data
    public static class FileConfig implements Serializable {
        /**
         * 输入文件的根路径
         */
        private String inputRootPath;

        /**
         * 输出文件的根路径
         */
        private String outputRootPath;

        /**
         * 源文件的根路径
         */
        private String sourceRootPath;

        /**
         * 文件类型
         */
        private String type;

        /**
         * 文件信息列表
         */
        private List<FileInfo> files;

        /**
         * 文件信息类，用于存储单个文件的详细信息
         */
        @NoArgsConstructor
        @Data
        public static class FileInfo implements Serializable{
            /**
             * 文件的输入路径
             */
            private String inputPath;

            /**
             * 文件的输出路径
             */
            private String outputPath;

            /**
             * 文件类型
             */
            private String type;

            /**
             * 文件生成类型
             */
            private String generateType;

            /**
             * 文件生成条件
             */
            private String condition;

            /**
             * 文件分组的键
             */
            private String groupKey;

            /**
             * 文件分组的名称
             */
            private String groupName;

            /**
             * 子文件信息列表
             */
            private List<FileInfo> files;
        }
    }

    /**
     * 模型配置类，用于存储模型相关的配置信息
     */
    @NoArgsConstructor
    @Data
    public static class ModelConfig {
        /**
         * 模型信息列表
         */
        private List<ModelInfo> models;

        /**
         * 模型信息类，用于存储单个模型的详细信息
         */
        @NoArgsConstructor
        @Data
        public static class ModelInfo {
            /**
             * 模型字段名称
             */
            private String fieldName;

            /**
             * 模型字段类型
             */
            private String type;

            /**
             * 模型字段描述
             */
            private String description;

            /**
             * 模型字段的默认值
             */
            private Object defaultValue;

            /**
             * 模型字段的缩写
             */
            private String abbr;

            /**
             * 模型字段分组的键
             */
            private String groupKey;

            /**
             * 模型字段分组的名称
             */
            private String groupName;

            /**
             * 子模型信息列表
             */
            private List<ModelInfo> models;

            /**
             * 模型字段的生成条件
             */
            private String condition;

            // 中间参数
            // 该分组下所有参数拼接字符串
            private String allArgsStr;
        }
    }
}


/*
    文件路径的选取尽量使用折叠路径结构：
        1.考虑到URL地址的场景，路径的结构不一定需要展开
        2.扁平化的路径会让JSON结构更清晰精简，前期更利于开发和维护

    注意：
        项目开发的时候我主要选择的是更简单的做法，这样以便于未来可能的需求变更
 */
